package ar.edu.ufasta.presupuestos.logica.aplicativo;

import java.sql.ResultSet;
import java.util.Date;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import ar.edu.ufasta.presupuestos.logica.entidades.Cliente;
import ar.edu.ufasta.presupuestos.logica.entidades.Domicilio;
import ar.edu.ufasta.presupuestos.servicios.ConexionMySQL;
import ar.edu.ufasta.presupuestos.servicios.persistencia.ObjectID;
import ar.edu.ufasta.presupuestos.servicios.persistencia.PersistenceFacade;

public class ControladorSeccionClientes extends ControladorGenerico {
	
	private Cliente miCliente;
	private Hashtable<String, Object> parametros;
	
	
	public Vector<Object[]> getRegistrosDonde(int tipo,String ordenLista, int condicion) throws Exception{
		Vector<Object[]> vec;
		vec = new Vector<Object[]>();
		switch (tipo) {
		case 1: // Clientes
			vec = buscarClientes(ordenLista,condicion);	
			break;
		case 2: // Provincias
			vec = buscarProvincias(ordenLista,condicion);
			break;
		default:
			break;
		}
		return vec;
	}


	// TODO Llamada directa a BD porque no le veo sentido de hacer un mapper para esto
	private Vector<Object[]> buscarProvincias(String ordenLista, int condicion) {
		Vector<Object[]> vec;
		vec = new Vector<Object[]>();
		try {
			ConexionMySQL conn = ConexionMySQL.getInstancia();
			String zQuery = null;
			zQuery = "SELECT * FROM PROVINCIAS";
			ResultSet resul = conn.executeQuery(zQuery);
			while(resul.next()){
				Object[] record = new Object[2];
				record[0] = resul.getInt("ID");
				record[1] = resul.getString("nombre");
				vec.addElement(record);
			}
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
		return vec;
	}


	@SuppressWarnings("unchecked")
	private Vector<Object[]> buscarClientes(String ordenLista, int condicion) {
		List<Cliente> listado;
		Vector<Object[]> vec;
		vec = new Vector<Object[]>();
		
		listado = (List<Cliente>) PersistenceFacade.getInstance().search(Cliente.class, null);
		
		for (Iterator iterator = listado.iterator(); iterator.hasNext();) {
			Cliente clienteAct = (Cliente) iterator.next();
			// Devuelvo arreglo de valores para la lista
			Object[] record = new Object[5];
			record[0] = clienteAct.getIDValue();
			record[1] = clienteAct.getApellido()+", "+clienteAct.getNombre();
			record[2] = clienteAct.getDomicilio().getDireccion();
			record[3] = clienteAct.getTelefono();
			record[4] = clienteAct.getEmail();
			vec.addElement(record);
		}
		
		return vec;
	}
	
	
	/**
	 * Encuentra un cliente registrado en el sistema
	 * 
	 * @param code -> ID del cliente a traer de la base de datos
	 * @return void
	 * @throws Exception
	 * 
	 */
	public Hashtable<String, Object> consultaCliente(String code) throws Exception{
		Hashtable<String, Object> clienteMap = new Hashtable<String, Object>();
		try {
			miCliente = (Cliente)PersistenceFacade.getInstance().get(new ObjectID(Integer.valueOf(code)), Cliente.class);
			
			clienteMap.put("vClienteID", miCliente.getIDValue());
			clienteMap.put("vNombre", miCliente.getNombre());
			clienteMap.put("vApellido", miCliente.getApellido());
			clienteMap.put("vEmail", miCliente.getEmail());
			clienteMap.put("vTelefono", miCliente.getTelefono());
			clienteMap.put("vCelular", miCliente.getCelular());
			clienteMap.put("vDireccion", miCliente.getDomicilio().getDireccion());
			clienteMap.put("vCiudad", miCliente.getDomicilio().getCiudad());
			clienteMap.put("vCodigoPostal", miCliente.getDomicilio().getCodigoPostal());
			clienteMap.put("vProvincia", miCliente.getDomicilio().getProvinciaCode());
			clienteMap.put("vUsuario", miCliente.getUsuario());
			clienteMap.put("vPassword", miCliente.getPassword());
			clienteMap.put("vFechaCreacion", miCliente.getFechaCreacion());
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}		
		return clienteMap;
	}
	
	/**
	 * Inserta un nuevo cliente en la base de datos
	 * 
	 * @param params ->
	 *            Parametros del cliente a insertar
	 * @return codigo de operacion
	 * @throws Exception
	 * 
	 */
	public int insertaCliente(String nombrePK, Hashtable<String, Object> params, Vector<Object[]> items){
		Boolean resul_val=false;
		int ret;
		
		this.parametros = params;
		miCliente = new Cliente();
		Domicilio domicilio = new Domicilio();
		
		miCliente.setNombre((String)parametros.get("vNombre"));
		miCliente.setApellido((String)parametros.get("vApellido"));
		miCliente.setTelefono((String)parametros.get("vTelefono"));
		miCliente.setCelular((String)parametros.get("vCelular"));
		miCliente.setEmail((String)parametros.get("vEmail"));
		miCliente.setUsuario((String)parametros.get("vUsuario"));
		miCliente.setPassword((String)parametros.get("vPassword"));
		domicilio.setDireccion((String)parametros.get("vDireccion"));
		domicilio.setCiudad((String)parametros.get("vCiudad"));
		domicilio.setCodigoPostal((Integer)parametros.get("vCodigoPostal"));
		domicilio.setProvinciaCode((Integer)parametros.get("vProvincia"));
		miCliente.setDomicilio(domicilio);
		miCliente.setFechaCreacion(new Date());
		
		resul_val = PersistenceFacade.getInstance().put(miCliente);
		if (resul_val==true){
			ret = Constantes.OPERACION_OK.getValue();
		}else{
			ret = Constantes.ERROR_EN_CONSULTA_SQL.getValue();
		}
		return ret;
	}
	
	/**
	 * Elimina un presupuesto en la base de datos
	 * 
	 * @param params -> Parametros del presupuesto a eliminar
	 * @return resultCode
	 * @throws Exception 
	 */
	@SuppressWarnings("unchecked")
	public int eliminaCliente(Hashtable<String, Object> params){
		Boolean resul_val=false;
		int ret;
		this.parametros = params;
//		List<Presupuesto> listado;
//		Map<String, String> condicion=new Hashtable<String, String>();
//		int ID = (Integer)parametros.get("vClienteID");
//		condicion.put("ID_cliente", String.valueOf(ID));
		
//		listado = (List<Presupuesto>)PersistenceFacade.getInstance().search(Presupuesto.class, condicion);
//		if (listado.size() != 0){
//			return Constantes.ERROR_CLIENTE_CON_PRESUPUESTOS.getValue();
//		}		
		miCliente = new Cliente();
		miCliente.setOid(new ObjectID((Integer)parametros.get("vClienteID")));
		
		if(miCliente.presupuestosAsociados()){
			return Constantes.ERROR_CLIENTE_CON_PRESUPUESTOS.getValue();
		}
		
		resul_val = PersistenceFacade.getInstance().remove(miCliente.getOid(), Cliente.class);
		if (resul_val == true)
			ret = Constantes.OPERACION_OK.getValue();
		else
			ret = Constantes.ERROR_EN_CONSULTA_SQL.getValue();
		return ret;
	}
	
	
	/**
	 * Modifica un cliente de la base de datos
	 * @param params -> Parametros del cliente a modificar
	 * @return codigo de operacion
	 * @throws excepcion
	 */
	public int modificaCliente(Hashtable<String, Object> params, Vector<Object[]> items){
		Boolean resul_val=false;
		int ret;
		
		this.parametros = params;
		miCliente = new Cliente();
		Domicilio domicilio = new Domicilio();
		
		miCliente.setOid(new ObjectID((Integer)parametros.get("vClienteID")));
		miCliente.setNombre((String)parametros.get("vNombre"));
		miCliente.setApellido((String)parametros.get("vApellido"));
		miCliente.setTelefono((String)parametros.get("vTelefono"));
		miCliente.setCelular((String)parametros.get("vCelular"));
		miCliente.setEmail((String)parametros.get("vEmail"));
		miCliente.setUsuario((String)parametros.get("vUsuario"));
		miCliente.setPassword((String)parametros.get("vPassword"));
		domicilio.setDireccion((String)parametros.get("vDireccion"));
		domicilio.setCiudad((String)parametros.get("vCiudad"));
		domicilio.setCodigoPostal((Integer)parametros.get("vCodigoPostal"));
		domicilio.setProvinciaCode((Integer)parametros.get("vProvincia"));
		miCliente.setDomicilio(domicilio);
		miCliente.setFechaCreacion((Date)parametros.get("vFechaCreacion"));
		
		resul_val = PersistenceFacade.getInstance().put(miCliente);
		if (resul_val==true){
			ret = Constantes.OPERACION_OK.getValue();
		}else{
			ret = Constantes.ERROR_EN_CONSULTA_SQL.getValue();
		}
		return ret;
	}
	
	
}
